#include <iostream>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <signal.h>

/* 进程等待 */
// int main()
// {
//     pid_t id = fork();
//     if(id == 0)
//     {
//         // child
//         std::cout << "i am child process" << std::endl;
//         sleep(5);
//         exit(1);
//     }

//     // father
//     int status = 0;
//     waitpid(id, &status, 0);
//     printf("exit code: %d  exit signal: %d coredump: %d\n", WEXITSTATUS(status), WTERMSIG(status), (status >> 7) & 0x1);
//     return 0;
// }

/* 进程替换 */
// int main()
// {
//     int a = 1, b = 5;
//     execlp("ls", "-1", "-a", nullptr);
//     std::cout << "我的pid: " << getpid() << std::endl; 
//     return 0;
// }


// int main(int argc, char* argv[])
// {
//    fork();
//    fork() && fork() || fork();
//    fork();
//    sleep(5);
// }

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>

int main() {
    pid_t pid = fork();
    if (pid < 0) {
        perror("fork failed");
        exit(1);
    } else if (pid == 0) {
        // 子进程
        printf("i am child process\n");
        sleep(5);
        raise(3);
        exit(123);
    } else {
        // 父进程
        int status;
        waitpid(pid, &status, 0);
        int exit_code, exit_signal, core_dump;
        if (WIFEXITED(status)) {
            exit_code = WEXITSTATUS(status);
            exit_signal = 0;
            core_dump = 0;
        } else {
            exit_code = -1;
            exit_signal = WTERMSIG(status);
            core_dump = WCOREDUMP(status);
        }
        printf("Exit code: %d\n", exit_code);
        printf("Exit signal: %d\n", exit_signal);
        printf("Core dump: %s\n", core_dump ? "yes" : "no");
    }
    return 0;
}